package com.vividstores.integration.mq;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import com.ibm.mq.MQException;

public interface MQFileSender extends MQFileDispatcher {

	/**
	 * <p>
	 * 通过Queue传输文件，Queue连接信息从{@link MQFileDispatcher}中指定。传输细节和数据完整性由实现保证。
	 * 任何异常情况下终止方法的执行都会对Queue的事务进行回滚，队列中不会写入和发送文件。方法正常调用成功后会向
	 * 队列中写入并发送文件，方法返回。
	 * </p>
	 * 
	 * <p>
	 * 在{@link MQFileBundleHeader}中设定文件传输请求的通用头信息。
	 * 业务相关字段通过{@link MQFileBundleHeader#setData(java.util.Map)}设置，如：
	 * <code>
	 * Map<String, String> headExtension = new HashMap<String, String>();
	 * headExtension.put("CustomerID", "023819874");
	 * headExtension.put("OpportunityId", "oppo238982");
	 * headExtension.put("properties", "{mobile: "+8613838383838", city: "上海市"}");
	 * header.setData(headExtension);
	 * </code>
	 * 方法只负责对数据的传输，由应用程序使用方负责对数据的解析和操作。
	 * </p>
	 * 
	 * <p>
	 * 方法支持批量文件发送，在一次请求中可发送多个文件，通过{@link MQFileBundle#setFiles()}指定，对每个需要
	 * 发送的文件，通过{@link MQFile#setFile(java.io.File)}}指向需要发送的文件路径。
	 * <code>
	 * List<MQFile> files = new ArrayList<MQFile>();
	 * 			
	 * File file1 = new File("D:\\精通WebSphere MQ.pdf");
	 * MQFile mqFile1 = new MQFile();
	 * mqFile1.setFile(file1);
	 * mqFile1.setType(MQFileType.PDF);
	 * Map<String, String> fileExtension1 = new HashMap<String, String>();
	 * fileExtension1.put("FILE_PARAM_1", "FILE_PARAM_VALUE_1");
	 * fileExtension1.put("FILE_PARAM_2", "FILE_PARAM_VALUE_2");
	 * mqFile1.setData(fileExtension1);
	 * files.add(mqFile1);
	 * 
	 * File file2 = new File("D:\\Websphere+MQ+API.chm");
	 * MQFile mqFile2 = new MQFile();
	 * mqFile2.setFile(file2);
	 * mqFile2.setType(MQFileType.Image);
	 * Map<String, String> fileExtension2 = new HashMap<String, String>();
	 * fileExtension2.put("FILE_PARAM_3", "FILE_PARAM_VALUE_3");
	 * fileExtension2.put("FILE_PARAM_4", "FILE_PARAM_VALUE_4");
	 * mqFile2.setData(fileExtension2);
	 * files.add(mqFile2);
	 * 
	 * fileBundle.setFiles(files);
	 * </code>
	 * 只需设置好{@link MQFile#setType(MQFileType)}和{@link MQFile#setFile(File)}，余下数据接口方法会自动填充。
	 * 
	 * 与每个文件相关的业务字段可通过{@link MQFile#setData(java.util.Map)}设置，方法只负责对数据的传输，由应用程序使用方负责对数据的解析和操作。
	 * </p>
	 * 
	 * @param fileBundle
	 * @throws FileNotFoundException
	 *             {@link MQFileBundle#getFiles()}中任意一个{@link MQFile#getFile()}
	 *             指定的文件不存在、或是文件夹、或无法打开文件进行读取
	 * @throws IOException
	 *             进行文件和队列操作时抛出
	 * @throws MQException
	 *             当WebSphere MQ产生错误时抛出
	 */
	public void send(MQFileBundle fileBundle) throws FileNotFoundException,
			IOException, MQException;

}